package com.xiongwei.io;

import java.io.*;

/**
 * Java标准库的java.io.OutputStream定义了所有输出流的超类：
 *
 * FileOutputStream实现了文件流输出；
 *
 * ByteArrayOutputStream在内存中模拟一个字节流输出。
 *
 * 某些情况下需要手动调用OutputStream的flush()方法来强制输出缓冲区。
 *
 * 总是使用try(resource)来保证OutputStream正确关闭。
 *
 * @author XiongWei
 * @date 2021/1/8
 */
public class OutputStreamUse {

    public static void main(String[] args) {
        OutputStreamUse osu = new OutputStreamUse();
        //osu.testWriteByteArray();
        //osu.testByteArrayOutputStream();
        osu.test();
    }

    public void testWriteByteArray() {
        try (OutputStream os = new FileOutputStream("src/com/xiongwei/io/readme.txt")) {
            byte[] bb = "hello,world!".getBytes();
            os.write(bb);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * ByteArrayOutputStream在内存中模拟一个字节流输出。
     */
    public void testByteArrayOutputStream() {
        byte[] bb;
        try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
            os.write("nihao".getBytes());
            bb = os.toByteArray();
            System.out.println(new String(bb, "UTF-8"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 同时读写两个文件
     */
    public void test() {
        try (InputStream input = new FileInputStream("src/com/xiongwei/io/io简介.txt");
             OutputStream output = new FileOutputStream("src/com/xiongwei/io/readme.txt"))
        {
            input.transferTo(output); // transferTo的作用是?
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
